home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Programming Languages Suite
/
ProgLangD.iso
/
BORLAND TURBO
/
ROWLST.PAK
/
RLISTVW.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1997-05-06
|
10KB
|
394 lines
// RListVw.cpp : implementation of the CRowListView class
//
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1996 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include "stdafx.h"
#include "RowList.h"
#include "RListDoc.h"
#include "ListVwEx.h" // base class for CRowListView
#include "RListVw.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CRowListView
IMPLEMENT_DYNCREATE(CRowListView, CListViewEx)
BEGIN_MESSAGE_MAP(CRowListView, CListViewEx)
//{{AFX_MSG_MAP(CRowListView)
ON_COMMAND(ID_VIEW_SMALLICONS, OnViewSmallIcons)
ON_COMMAND(ID_VIEW_LARGEICONS, OnViewLargeIcons)
ON_COMMAND(ID_VIEW_LIST, OnViewList)
ON_COMMAND(ID_VIEW_DETAILS, OnViewDetails)
ON_COMMAND(ID_VIEW_ROWDETAILS, OnViewFullRowDetails)
ON_UPDATE_COMMAND_UI(ID_VIEW_SMALLICONS, OnUpdateViewSmallIcons)
ON_UPDATE_COMMAND_UI(ID_VIEW_LARGEICONS, OnUpdateViewLargeIcons)
ON_UPDATE_COMMAND_UI(ID_VIEW_LIST, OnUpdateViewList)
ON_UPDATE_COMMAND_UI(ID_VIEW_DETAILS, OnUpdateViewDetails)
ON_UPDATE_COMMAND_UI(ID_VIEW_ROWDETAILS, OnUpdateViewFullRowDetails)
ON_COMMAND(ID_VIEW_STATEICONS, OnViewStateIcons)
ON_UPDATE_COMMAND_UI(ID_VIEW_STATEICONS, OnUpdateViewStateIcons)
ON_COMMAND(ID_VIEW_CLIENTWIDTHSEL, OnViewClientWidthSel)
ON_UPDATE_COMMAND_UI(ID_VIEW_CLIENTWIDTHSEL, OnUpdateViewClientWidthSel)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONDBLCLK()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRowListView construction/destruction
CRowListView::CRowListView()
{
m_bStateIcons=TRUE;
m_nCheckedItem=-1;
m_hSmallIcon=NULL;
m_hLargeIcon=NULL;
}
CRowListView::~CRowListView()
{
}
BOOL CRowListView::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style|= LVS_SHOWSELALWAYS | LVS_REPORT;
return CListViewEx::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// data for the list view control
#define NUM_COLUMNS 8
#define NUM_ITEMS 7
static _TCHAR *_gszColumnLabel[NUM_COLUMNS]=
{
_T("Color"), _T("Red"), _T("Green"), _T("Blue"), _T("Hue"), _T("Sat"), _T("Lum"), _T("Type")
};
static int _gnColumnFmt[NUM_COLUMNS]=
{
LVCFMT_LEFT, LVCFMT_RIGHT, LVCFMT_RIGHT, LVCFMT_RIGHT,
LVCFMT_RIGHT, LVCFMT_RIGHT, LVCFMT_RIGHT, LVCFMT_CENTER
};
static int _gnColumnWidth[NUM_COLUMNS]=
{
150, 50, 50, 50, 100, 50, 50, 150
};
static _TCHAR *_gszItem[NUM_ITEMS][NUM_COLUMNS]=
{
_T("Yellow"), _T("255"), _T("255"), _T("0"), _T("40"), _T("240"), _T("120"), _T("Neutral"),
_T("Red"), _T("255"), _T("0"), _T("0"), _T("0"), _T("240"), _T("120"), _T("Warm"),
_T("Green"), _T("0"), _T("255"), _T("0"), _T("80"), _T("240"), _T("120"), _T("Cool"),
_T("Magenta"), _T("255"), _T("0"), _T("255"), _T("200"), _T("240"), _T("120"), _T("Warm"),
_T("Cyan"), _T("0"), _T("255"), _T("255"), _T("120"), _T("240"), _T("120"), _T("Cool"),
_T("Blue"), _T("0"), _T("0"), _T("255"), _T("160"), _T("240"), _T("120"), _T("Cool"),
_T("Gray"), _T("192"), _T("192"), _T("192"), _T("160"), _T("0"), _T("181"), _T("Neutral")
};
/////////////////////////////////////////////////////////////////////////////
// CRowListView initialization
void CRowListView::OnInitialUpdate()
{
CListViewEx::OnInitialUpdate();
CListCtrl& ListCtrl=GetListCtrl();
// set image lists
m_LargeImageList.Create(IDB_LARGEICONS,32,1,RGB(255,255,255));
m_SmallImageList.Create(IDB_SMALLICONS,16,1,RGB(255,255,255));
m_StateImageList.Create(IDB_STATEICONS,16,1,RGB(255,0,0));
m_LargeImageList.SetOverlayImage(NUM_ITEMS,1);
m_SmallImageList.SetOverlayImage(NUM_ITEMS,1);
ListCtrl.SetImageList(&m_LargeImageList,LVSIL_NORMAL);
ListCtrl.SetImageList(&m_SmallImageList,LVSIL_SMALL);
ListCtrl.SetImageList(&m_StateImageList,LVSIL_STATE);
// insert columns
int i, j;
LV_COLUMN lvc;
lvc.mask=LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
for(i=0; i<NUM_COLUMNS; i++)
{
lvc.iSubItem=i;
lvc.pszText=_gszColumnLabel[i];
lvc.cx=_gnColumnWidth[i];
lvc.fmt=_gnColumnFmt[i];
ListCtrl.InsertColumn(i,&lvc);
}
// insert items
LV_ITEM lvi;
for(i=0; i<NUM_ITEMS; i++)
{
lvi.mask=LVIF_TEXT | LVIF_IMAGE | LVIF_STATE;
lvi.iItem=i;
lvi.iSubItem=0;
lvi.pszText=_gszItem[i][0];
lvi.iImage=i;
lvi.stateMask=LVIS_STATEIMAGEMASK;
lvi.state=INDEXTOSTATEIMAGEMASK(1);
ListCtrl.InsertItem(&lvi);
}
// set item text for additional columns
for(i=0; i<NUM_ITEMS; i++) for(j=1; j<NUM_COLUMNS; j++)
ListCtrl.SetItemText(i,j,_gszItem[i][j]);
}
/////////////////////////////////////////////////////////////////////////////
// CRowListView diagnostics
#ifdef _DEBUG
void CRowListView::AssertValid() const
{
CListViewEx::AssertValid();
}
void CRowListView::Dump(CDumpContext& dc) const
{
CListViewEx::Dump(dc);
}
CRowListDoc* CRowListView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CRowListDoc)));
return (CRowListDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CRowListView helpers
BOOL CRowListView::SetViewType(DWORD dwViewType)
{
return(ModifyStyle(LVS_TYPEMASK,dwViewType & LVS_TYPEMASK));
}
DWORD CRowListView::GetViewType()
{
return(GetStyle() & LVS_TYPEMASK);
}
void CRowListView::CheckItem(int nNewCheckedItem)
{
CListCtrl& ListCtrl=GetListCtrl();
// reset if there is checked item
if(m_nCheckedItem!=-1)
{
if(m_bStateIcons)
ListCtrl.SetItemState(m_nCheckedItem,
INDEXTOSTATEIMAGEMASK(1),LVIS_STATEIMAGEMASK);
else
ListCtrl.SetItemState(m_nCheckedItem,
INDEXTOSTATEIMAGEMASK(1),LVIS_STATEIMAGEMASK | LVIS_OVERLAYMASK);
::DestroyIcon(m_hSmallIcon);
::DestroyIcon(m_hLargeIcon);
}
// check new item and set its icon as the app icon
CWnd* pMainWnd=AfxGetMainWnd();
if(m_nCheckedItem==nNewCheckedItem)
{
m_nCheckedItem=-1;
pMainWnd->SetIcon(NULL,FALSE);
pMainWnd->SetIcon(NULL,TRUE);
}
else if((m_nCheckedItem=nNewCheckedItem)!=-1)
{
if(m_bStateIcons)
ListCtrl.SetItemState(m_nCheckedItem,
INDEXTOSTATEIMAGEMASK(2),LVIS_STATEIMAGEMASK);
else
ListCtrl.SetItemState(m_nCheckedItem,
INDEXTOSTATEIMAGEMASK(2) | INDEXTOOVERLAYMASK(1),
LVIS_STATEIMAGEMASK | LVIS_OVERLAYMASK);
m_hSmallIcon=ListCtrl.GetImageList(LVSIL_SMALL)->ExtractIcon(nNewCheckedItem);
pMainWnd->SetIcon(m_hSmallIcon,FALSE);
m_hLargeIcon=ListCtrl.GetImageList(LVSIL_NORMAL)->ExtractIcon(nNewCheckedItem);
pMainWnd->SetIcon(m_hLargeIcon,TRUE);
}
}
/////////////////////////////////////////////////////////////////////////////
// CRowListView message handlers
void CRowListView::OnViewSmallIcons()
{
if(GetViewType()!=LVS_SMALLICON)
SetViewType(LVS_SMALLICON);
}
void CRowListView::OnViewLargeIcons()
{
if(GetViewType()!=LVS_ICON)
SetViewType(LVS_ICON);
}
void CRowListView::OnViewList()
{
if(GetViewType()!=LVS_LIST)
SetViewType(LVS_LIST);
}
void CRowListView::OnViewDetails()
{
if((GetViewType()!=LVS_REPORT) || GetFullRowSel())
{
SetFullRowSel(FALSE);
if(GetViewType()!=LVS_REPORT)
SetViewType(LVS_REPORT);
}
}
void CRowListView::OnViewFullRowDetails()
{
if((GetViewType()!=LVS_REPORT) || !GetFullRowSel())
{
SetFullRowSel(TRUE);
if(GetViewType()!=LVS_REPORT)
SetViewType(LVS_REPORT);
}
}
void CRowListView::OnUpdateViewSmallIcons(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(GetViewType()==LVS_SMALLICON);
}
void CRowListView::OnUpdateViewLargeIcons(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(GetViewType()==LVS_ICON);
}
void CRowListView::OnUpdateViewList(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(GetViewType()==LVS_LIST);
}
void CRowListView::OnUpdateViewDetails(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck((GetViewType()==LVS_REPORT) && !GetFullRowSel());
}
void CRowListView::OnUpdateViewFullRowDetails(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck((GetViewType()==LVS_REPORT) && GetFullRowSel());
}
void CRowListView::OnViewStateIcons()
{
m_bStateIcons=!m_bStateIcons;
CListCtrl& ListCtrl=GetListCtrl();
if(m_bStateIcons)
{
ListCtrl.SetImageList(&m_StateImageList,LVSIL_STATE);
ListCtrl.SetItemState(m_nCheckedItem,0,LVIS_OVERLAYMASK);
}
else
{
ListCtrl.SetImageList(NULL,LVSIL_STATE);
if(m_nCheckedItem!=-1)
ListCtrl.SetItemState(m_nCheckedItem,INDEXTOOVERLAYMASK(1),LVIS_OVERLAYMASK);
}
}
void CRowListView::OnUpdateViewStateIcons(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_bStateIcons);
}
void CRowListView::OnViewClientWidthSel()
{
m_bClientWidthSel=!m_bClientWidthSel;
Invalidate();
UpdateWindow();
}
void CRowListView::OnUpdateViewClientWidthSel(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_bClientWidthSel);
pCmdUI->Enable((GetViewType()==LVS_REPORT) && GetFullRowSel());
}
void CRowListView::OnLButtonDown(UINT nFlags, CPoint point)
{
UINT uFlags=0;
int nHitItem=GetListCtrl().HitTest(point,&uFlags);
// we need additional checking in owner-draw mode
// because we only get LVHT_ONITEM
BOOL bHit=FALSE;
if(uFlags==LVHT_ONITEM && (GetStyle() & LVS_OWNERDRAWFIXED))
{
CRect rect;
GetListCtrl().GetItemRect(nHitItem,rect,LVIR_ICON);
// check if hit was on a state icon
if(m_bStateIcons && point.x<rect.left)
bHit=TRUE;
}
else if(uFlags & LVHT_ONITEMSTATEICON)
bHit=TRUE;
if(bHit)
CheckItem(nHitItem);
else
CListViewEx::OnLButtonDown(nFlags, point);
}
void CRowListView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
UINT uFlags=0;
int nHitItem=GetListCtrl().HitTest(point,&uFlags);
if(uFlags & LVHT_ONITEM)
{
// double click works only if we don't have state icons,
// or if we are in icon or small icon view
if(!m_bStateIcons || GetViewType()==LVS_ICON || GetViewType()==LVS_SMALLICON)
CheckItem(nHitItem);
}
CListViewEx::OnLButtonDblClk(nFlags, point);
}